package LocalCRM::Doc::Account;

use base 'LocalCRM::Doc';
use Data::Dumper;
use PDF::Table;
use Encode;

sub new
{
    my $self = shift->SUPER::new();
    my %arg  = @_;

    $self->{page} = $self->{pdf}->page();
    $self->{page}->mediabox('A4');

    $self->{_table}= new PDF::Table;

    $self->{data}->{content}=
    [
	[
	    encode('windows-1251',decode_utf8('№')),
	    encode('windows-1251',decode_utf8('Наименование товара')),
	    encode('windows-1251',decode_utf8("Единица\nизмерения")),
	    encode('windows-1251',decode_utf8('Количество')),
	    encode('windows-1251',decode_utf8('Цена')),
	    encode('windows-1251',decode_utf8('Сумма')),
	]
    ];

    my $text	= $self->{page}->text();

    if ( $arg{id} )
    {
	$self->id($arg{id})
    }
    elsif ( $arg{'executive_id'} )
    {
	$self->{invoice} = $self->{_db}->getById('executive',$arg{'executive_id'});
    }
    else
    {
	$text->font($self->{font}->{VerdanaB},16);
	$text->translate(30,550);
	$text->text($self->utf2win('Недостаточно параметров для формирования документа'));
	$text->font($self->{font}->{Verdana},12);
	$text->cr(-30);
	$text->text($self->utf2win('В ходе формирования документа произошла ошибка!'));
	$text->cr(-15);
	$text->text($self->utf2win('В метод формирования не были переданы обязательные параметры'));
	$text->cr(-15);
	$text->text($self->utf2win('Номер документа для формирования или ID исполнителя услуги.'));
	return $self;
    }

    my $gfx	= $self->{page}->gfx();
    $gfx->linewidth(1);

##
## Рисуем таблицу
##
# Прорисовка всех горизонтальных линий
    $gfx->move(20,760);
    $gfx->hline(19.5/2.54*72);

    $gfx->move(20,745);
    $gfx->hline(360);

    $gfx->move(20,705);
    $gfx->hline(19.5/2.54*72);

    $gfx->move(360,685);
    $gfx->hline(400);

    $gfx->move(20,665);
    $gfx->hline(19.5/2.54*72);

# Прорисовка всех вертикальных линий
    $gfx->move(20,760);
    $gfx->vline(665);

    $gfx->move(170,760);
    $gfx->vline(745);

    $gfx->move(360,760);
    $gfx->vline(665);

    $gfx->move(400,760);
    $gfx->vline(665);

    $gfx->move(19.5/2.54*72,760);
    $gfx->vline(665);

# Вывод
    $gfx->stroke();
    undef $gfx;

# Заполнение шапки таблицы
    $text->font($self->{font}->{VerdanaB},10);
    $text->translate(20,810);
    $text->text(encode('windows-1251',decode_utf8($self->{invoice}->{account_text1})),-underline=>'auto');
    $text->cr(-15);
    $text->text(encode('windows-1251',decode_utf8($self->{invoice}->{account_text2})));

    $text->cr(-15);
    $text->font($self->{font}->{Verdana},10);
    $text->text(encode('windows-1251',decode_utf8($self->{invoice}->{account_text3})));

    $text->translate(150,765);
    $text->font($self->{font}->{VerdanaB},8);
    $text->text(encode('windows-1251',decode_utf8('Образец заполнения платёжного поручения')));

    $text->font($self->{font}->{Verdana},10);

# ИНН
    $self->{_table}->text_block
    (
	$text,
	encode('windows-1251',decode_utf8(sprintf 'ИНН: %s', $self->{invoice}->{account_inn})),
	x	=> 20,
	y	=> 749,
	w	=> 140,
	h	=> 15,
	align	=> 'center',
    );

# КПП
    $self->{_table}->text_block
    (
	$text,
	encode('windows-1251',decode_utf8(sprintf 'КПП: %s', $self->{invoice}->{account_kpp})),
	x	=> 190,
	y	=> 749,
	w	=> 140,
	h	=> 15,
	align	=> 'center',
    );

# "Сч.№"
    $self->{_table}->text_block
    (
	$text,
	encode('windows-1251',decode_utf8('Сч.№')),
	x	=> 360,
	y	=> 710,
	w	=> 40,
	h	=> 15,
	align	=> 'center',
    );

# Р/С
    $self->{_table}->text_block
    (
	$text,
	$self->{invoice}->{account_acc_num1},
	x	=> 400,
	y	=> 710,
	w	=> 152,
	h	=> 15,
	align	=> 'center',
    );

# "БИК"
    $self->{_table}->text_block
    (
	$text,
	encode('windows-1251',decode_utf8('БИК')),
	x	=> 360,
	y	=> 690,
	w	=> 40,
	h	=> 15,
	align	=> 'center',
    );

# БИК
    $self->{_table}->text_block
    (
	$text,
	$self->{invoice}->{account_bik},
	x	=> 400,
	y	=> 690,
	w	=> 152,
	h	=> 15,
	align	=> 'center',
    );

# "Сч.№"
    $self->{_table}->text_block
    (
	$text,
	encode('windows-1251',decode_utf8('Сч.№')),
	x	=> 360,
	y	=> 670,
	w	=> 40,
	h	=> 15,
	align	=> 'center',
    );

# Р/С
    $self->{_table}->text_block
    (
	$text,
	$self->{invoice}->{account_acc_num2},
	x	=> 400,
	y	=> 670,
	w	=> 152,
	h	=> 15,
	align	=> 'center',
    );

# Получатель
    $self->{_table}->text_block
    (
	$text,
	encode('windows-1251',decode_utf8(sprintf "Получатель:\n%s", $self->{invoice}->{account_text4})),
	x	=> 20,
	y	=> 734,
	w	=> 340,
	h	=> 30,
	align	=> 'center',
    );

# Банк получателя
    $self->{_table}->text_block
    (
	$text,
	encode('windows-1251',decode_utf8(sprintf "Банк получателя:\n%s", $self->{invoice}->{account_text5})),
	x	=> 20,
	y	=> 695,
	w	=> 340,
	h	=> 30,
	align	=> 'center',
    );

    if ( $self->{invoice}->{account_text6} )
    {
	$text->translate(30,650);
	$text->text(encode('windows-1251',decode_utf8($self->{invoice}->{account_text6})));
    }

    $text->font($self->{font}->{VerdanaB},14);
    $self->{_table}->text_block
    (
	$text,
	$self->utf2win(sprintf 'СЧЕТ №%d от %s г.',$self->{invoice}->{id},$self->{invoice}->{date}->strftime('%d.%m.%Y')),
	x	=> 20,
	y	=> 620,
	w	=> 19.5/2.54*72,
	h	=> 30,
	align	=> 'center',
    );

    $text->font($self->{font}->{Verdana},9);

# Плательщик
    @r = $self->{_table}->text_block
    (
	$text,
	encode('windows-1251',decode_utf8(sprintf "Плательщик: %s", $self->{invoice}->{customer_name})),
	x	=> 20,
	y	=> 600,
	w	=> 19.5/2.54*72,
	h	=> 30,
	align	=> 'left',
    );

# Грузополучатель
    @r = $self->{_table}->text_block
    (
	$text,
	encode('windows-1251',decode_utf8(sprintf "Грузополучатель: %s", $self->{invoice}->{customer_name})),
	x	=> 20,
	y	=> $r[1]-15,
	w	=> 19.5/2.54*72,
	h	=> 30,
	align	=> 'left',
    );

    @r = $self->{_table}->table
    (
	$self->{pdf},
	$self->{page},
	$self->{data}->{content},
	font	=> $self->{font}->{Verdana},
	font_size	=> 9,
	x		=> 20,
	w		=> 19.5/2.54*72,
	start_y	=> $r[1]-20,
	next_y	=> 200,
	start_h	=> $r[1]-200,
	next_h	=> 100,
	padding	=> 5,
	column_props=>
	[
	    undef,
	    {min_w	=> 200},
	],
    );

# Дорисовываем ячейки внизу таблицы
    my $gfx = $self->{page}->gfx();

    $gfx->move($r[3][5],$r[2]-15);
    $gfx->hline($r[3][6]);

# Делаем описание к этим ячейкам
    $text->font($self->{font}->{VerdanaB},9);

    my $super_total;

# Дорисовываем ячейки внизу таблицы
    $gfx->move($r[3][5],$r[2]);
    $gfx->vline($r[2]-45);
    $gfx->move($r[3][6],$r[2]);
    $gfx->vline($r[2]-45);

    $gfx->move($r[3][5],$r[2]-30);
    $gfx->hline($r[3][6]);
    $gfx->move($r[3][5],$r[2]-45);
    $gfx->hline($r[3][6]);
    $gfx->move($r[3][5],$r[2]);
    $gfx->vline($r[2]-15);
    $gfx->move($r[3][6],$r[2]);
    $gfx->vline($r[2]-15);

    $gfx->stroke();

# Итого
    $text->translate($r[3][5]-40,$r[2]-12);
    $text->text($self->utf2win('Итого:'));

# Итого НДС
    if ( $self->{invoice}->{nds} )
    {
	$super_total = $self->amount($self->{data}->{sum}->{total}+$self->{data}->{sum}->{nds});

	$text->translate($r[3][5]-65,$r[2]-27);
	$text->text($self->utf2win('Итого НДС:'));
    }
    else
    {
	$super_total = $self->amount($self->{data}->{sum}->{total});

	$text->translate($r[3][5]-102,$r[2]-27);
	$text->text($self->utf2win('Без налога (НДС):'));
    }

# Итого к оплате
    $text->translate($r[3][5]-88,$r[2]-42);
    $text->text($self->utf2win('Итого к оплате:'));

    $text->font($self->{font}->{Verdana},9);

# Значение: ИТОГО
    $text->translate($r[3][5]+5,$r[2]-12);
    $text->text($self->{data}->{sum}->{total});

# Значение: НДС
    $text->translate($r[3][5]+5,$r[2]-27);

    if ( $self->{invoice}->{nds} )
    {
	$text->text($self->{data}->{sum}->{nds});
    }
    else
    {
	$text->text('-');
    }

# Значение: ИТОГО+НДС
    $text->translate($r[3][5]+5,$r[2]-42);
    $text->text($super_total);

    $text->translate(20,$r[2]-65);
    $text->text(encode('windows-1251',decode_utf8(sprintf 'Всего наименований %d на сумму %d руб., %02d коп.',$self->{data}->{count},int($super_total),($super_total*100%100))));
    $text->cr(-15);
    $text->text(sprintf '(%s)', $self->utf2win($self->num2str($super_total)));

    $text->cr(-40);
    $text->text(encode('windows-1251',decode_utf8(sprintf 'Руководитель предприятия: _____________________ / %s /',$self->{invoice}->{acoount_boss})));

    if ( $self->{invoice}->{account_comment} )
    {
	$text->cr(-10);
	$text->text(encode('windows-1251',decode_utf8($self->{invoice}->{account_comment})));
    }

    $text->cr(-20);
#    $text->text(encode('windows-1251',decode_utf8(sprintf 'Главный бухгалтер: ____________________________ / %s /',$self->{invoice}->{head_accountant})));
    $text->text($self->utf2win(sprintf 'Главный бухгалтер: ____________________________ / %s /',$self->{invoice}->{head_accountant}));

    return $self;
}

sub id
{
    my $self = shift->SUPER::id($_[0]);
    my $total;
    my $i;

    foreach my $row ( @{$self->{data}->{db}} )
    {
	$i++;

	push @{$self->{data}->{content}},
	[
	    $i,
	    $self->utf2win($row->{service_name}),
	    $self->utf2win($row->{unit}),
	    $row->{quantity},
	    $row->{price},
	    $self->amount($row->{price}*$row->{quantity}),
	];

	$total += $row->{price} * $row->{quantity};
    }

    $self->{data}->{count} = $i;
    $self->{data}->{sum}->{rub} = int($total);
    $self->{data}->{sum}->{kop} = $total*100%100;
    $self->{data}->{sum}->{total} = $self->amount($total);
    $self->{data}->{sum}->{nds} = $self->nds($total)->{value};

    return $self;
}

1;
